use strict;
use warnings;
use autodie;

#此脚本主要作用是对从各个网站获取的恶意IP数据，按照恶代
#当前的格式进行聚合。
#注意聚合的时候要保证原有数据不丢失
#调试perl脚本程序的时候建议使用如下的方式进行参数传递
#ls -l *.txt |awk 'BEGIN {inx=0;} {file_list[inx++]=$9} END {cmdline="perl malip_update_process.plx ";for(f in file_list){cmdline=cmdline""file_list[f]" ";}print cmdline;system(cmdline);}' -

my $file_count = @ARGV;
#print "total files : $file_count\n";
#做一些初始化的操作，使用下列语句将所有的IP分类标识统计出来
#grep -i -P " \"##[\\w|\\d|\\s]+\" *.txt | awk -F ':' '{print \$2}' - | awk '!a[\$0]++' -
my $cmdline = "grep"." -i -P"." \"##[\\w|\\d|\\s]+\" *.txt | awk -F ':' '{print \$2}' \- | awk '!a[\$0]++' \-";
#print "$cmdline\n";
#分析出来的ip类型数组
my @ip_desc_flags = `$cmdline`;
#关联具体ip分类的hash表
my %malip_hash;
#处理文件描述标识
for(@ip_desc_flags) {
	chomp($_);
	#print "~$_~\n";
	$malip_hash{$_} = [()];
}
#对各个文件进行过滤
#为了进行更好统计优先进行malip.txt分析
get_update_malip("myself_malip_data.txt");
for(@ARGV) {
	#print "-$_-\n";
	if($_ ne "myself_malip_data.txt") {
		get_update_malip($_);
	}
}
#对各个文件进行合并输出
#记录ip总数（去重之后）
my $total_ip = 0;
my %flag_no_repeat_ip_count_hash;
open(OUTPUT_MALIP_RES,">malip_new.txt");
for(@ip_desc_flags) {
	#根据这个类型数组一次进行输出
	#print $_;
	#my @malip_lines = $malip_hash{$_};
	#输出标识
	print OUTPUT_MALIP_RES "$_\n";
	#输出日期
	print OUTPUT_MALIP_RES `date "+#GDXY(%b %d %Y)"`;
	#对标记ip进行去重操作
	my %count;
	my @no_rep_malip_hash = grep{++$count{$_} < 2;}@{$malip_hash{$_}};
	#依次输出ip
	for(@no_rep_malip_hash) {
		print OUTPUT_MALIP_RES "$_\n";
	}
	$total_ip += @no_rep_malip_hash;
	$flag_no_repeat_ip_count_hash{$_} = @no_rep_malip_hash;
}
close(OUTPUT_MALIP_RES);
#最后对日志进行统计输出
#主要是对malip.txt的情况进行统计，原有的标识新增ip个数分别是哪些
#部分的，然后是新增的标识情况
#首先将旧的标识和IP统计出来
#然后去获取不同分类的标识并进行比较
#如果有则对ip进行统计看增减情况
output_changelog();

#旧的ip类型数组
#$cmdline = "grep"." -i -P"." \"##[\\w|\\d|\\s]+\" malip.txt";
my %old_ip_desc_flags;#旧ip标志对应信息
my %new_ip_desc_flags;#新ip标志对应信息
sub statics_malip
{
	my ($file_name,$flag_name,$ip_desc) = @_;
	if($file_name eq "myself_malip_data.txt") {
		#放到老标识统计hash
		$old_ip_desc_flags{$flag_name}{$ip_desc} = 1;
		if(!exists($old_ip_desc_flags{$flag_name}{"new_ip_neu_count"})) {
			$old_ip_desc_flags{$flag_name}{"new_ip_neu_count"} = 0;
		}
		if(!exists($old_ip_desc_flags{$flag_name}{"new_ip_openbl_count"})) {
			$old_ip_desc_flags{$flag_name}{"new_ip_openbl_count"} = 0;
		}
		if(!exists($old_ip_desc_flags{$flag_name}{"new_ip_drg_count"})) {
			$old_ip_desc_flags{$flag_name}{"new_ip_drg_count"} = 0;
		}
		if(!exists($old_ip_desc_flags{$flag_name}{"new_ip_nothink_count"})) {
			$old_ip_desc_flags{$flag_name}{"new_ip_nothink_count"} = 0;
		}
	} elsif($file_name =~ m/neu_/) {
		#是neu的，首先判断标识是否为新增
		if(exists($old_ip_desc_flags{$flag_name})) {
			#已有，统计ip数量，只统计没有的
			#先根据这个标志取出ip的hash
			if(!exists($old_ip_desc_flags{$flag_name}{$ip_desc})) {
				#表明没有ip然后对应的进行增加
				$old_ip_desc_flags{$flag_name}{"new_ip_neu_count"} += 1;
			}
		} else {
			#就直接统计数据
			if(!exists($new_ip_desc_flags{$flag_name}{"new_flag_ip_neu_count"})) {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_neu_count"} = 1;
			} else {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_neu_count"} += 1;
			}
		}
	} elsif($file_name =~ m/openbl_/) {
		#是openbl的
		if(exists($old_ip_desc_flags{$flag_name})) {
			#已有，统计ip数量，只统计没有的
			#先根据这个标志取出ip的hash
			if(!exists($old_ip_desc_flags{$flag_name}{$ip_desc})) {
				#表明没有ip然后对应的进行增加
				$old_ip_desc_flags{$flag_name}{"new_ip_openbl_count"} += 1;
			}
		} else {
			#就直接统计数据
			if(!exists($new_ip_desc_flags{$flag_name}{"new_flag_ip_openbl_count"})) {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_openbl_count"} = 1;
			} else {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_openbl_count"} += 1;
			}
		}
	} elsif($file_name =~ m/drg_/) {
		#是drg的
		if(exists($old_ip_desc_flags{$flag_name})) {
			#已有，统计ip数量，只统计没有的
			#先根据这个标志取出ip的hash
			if(!exists($old_ip_desc_flags{$flag_name}{$ip_desc})) {
				#表明没有ip然后对应的进行增加
				$old_ip_desc_flags{$flag_name}{"new_ip_drg_count"} += 1;
			}
		} else {
			#就直接统计数据
			if(!exists($new_ip_desc_flags{$flag_name}{"new_flag_ip_drg_count"})) {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_drg_count"} = 1;
			} else {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_drg_count"} += 1;
			}
		}
	} elsif($file_name =~ m/nothink/) {
		#是nothink的
		if(exists($old_ip_desc_flags{$flag_name})) {
			#已有，统计ip数量，只统计没有的
			#先根据这个标志取出ip的hash
			if(!exists($old_ip_desc_flags{$flag_name}{$ip_desc})) {
				#表明没有ip然后对应的进行增加
				$old_ip_desc_flags{$flag_name}{"new_ip_nothink_count"} += 1;
			}
		} else {
			#就直接统计数据
			if(!exists($new_ip_desc_flags{$flag_name}{"new_flag_ip_nothink_count"})) {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_nothink_count"} = 1;
			} else {
				$new_ip_desc_flags{$flag_name}{"new_flag_ip_nothink_count"} += 1;
			}
		}
	}
}

#对统计信息进行输出
sub output_changelog
{
	#首先输出旧的情况
	print "changelog ".`date`;
	print "old malip type statistic:\n";
	my $count = 0;
	#my @keys_list = %old_ip_desc_flags;
	for(keys %old_ip_desc_flags) {
		print "---- $_ ---- add new ip\n";
		if(exists($old_ip_desc_flags{$_}{"new_ip_neu_count"})) {
			$count = $old_ip_desc_flags{$_}{"new_ip_neu_count"};
		} else {
			$count = 0;
		}
		print "\tneu: $count\n";
		if(exists($old_ip_desc_flags{$_}{"new_ip_openbl_count"})) {
			$count = $old_ip_desc_flags{$_}{"new_ip_openbl_count"};	
		} else {
			$count = 0;
		}
		print "\topenbl: $count\n";
		if(exists($old_ip_desc_flags{$_}{"new_ip_drg_count"})) {
			$count = $old_ip_desc_flags{$_}{"new_ip_drg_count"};
		} else {
			$count = 0;
		}
		print "\tdrg: $count\n";
		if(exists($old_ip_desc_flags{$_}{"new_ip_nothink_count"})) {
			$count = $old_ip_desc_flags{$_}{"new_ip_nothink_count"};	
		} else {
			$count = 0;
		}
		print "\tnothink: $count\n";
		print "\ttotal $_ ip num:$flag_no_repeat_ip_count_hash{$_}\n";
	}
	#输出新的情况
	print "some new malip type is been added:\n";
	for(keys %new_ip_desc_flags) {
		print "---- $_ ---- add new ip\n";
		if(exists($new_ip_desc_flags{$_}{"new_flag_ip_neu_count"})) {
			$count = $new_ip_desc_flags{$_}{"new_flag_ip_neu_count"};	
		} else {
			$count = 0;
		}
		print "\tneu: $count\n";
		if(exists($new_ip_desc_flags{$_}{"new_flag_ip_openbl_count"})) {
			$count = $new_ip_desc_flags{$_}{"new_flag_ip_openbl_count"};	
		} else {
			$count = 0;
		}
		print "\topenbl: $count\n";
		if(exists($new_ip_desc_flags{$_}{"new_flag_ip_drg_count"})) {
			$count = $new_ip_desc_flags{$_}{"new_flag_ip_drg_count"};	
		} else {
			$count = 0;
		}
		print "\tdrg: $count\n";
		if(exists($new_ip_desc_flags{$_}{"new_flag_ip_nothink_count"})) {
			$count = $new_ip_desc_flags{$_}{"new_flag_ip_nothink_count"};	
		} else {
			$count = 0;
		}
		print "\tnothink: $count\n";
		print "\ttotal $_ ip num:$flag_no_repeat_ip_count_hash{$_}\n";
	}
	print "total ip : $total_ip\n";
}

#对每个文件进行处理最后进行聚合输出新文件
sub get_update_malip
{
	my $proc_file;
	($proc_file) = @_;
	print "$proc_file\n";
	open(PROC_FILE,$proc_file);
	#读取文件并将其按照标识和IP进行hash存放
	my @lines = <PROC_FILE>;
	close(PROC_FILE);
	my $cur_flag = "";
	for(@lines) {
		if(m/##[\w|\d|\s]+/) {
			$cur_flag = $_;
			chomp($cur_flag);
			#print "[$cur_flag]\n";
		} elsif(m/(\d+\.){3}\d+/ and $cur_flag ne "") {
			#保存恶意ip
			chomp($_);
			#print "-$_-\n";
			push(@{$malip_hash{$cur_flag}},$_);
			#对数据进行统计
			statics_malip($proc_file,$cur_flag,$_);
		}
	}
}
